package com.jmz.apt.api.message.request;

import com.jmz.apt.api.Utils.ObjectUtil;
import com.jmz.apt.api.message.response.ResponseMessage;
import com.jmz.apt.api.message.response.ResponseMessageTemplate;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;

/**
 * Created by fanglexue on 2019/10/28.
 */
public class RequestMessageTemplate {
    /**
     * 内部requestmessage对象
     */
    private RequestMessage requestMessage;

    /**
     * 内部ResponseMessageTemplete对象
     */
    private ResponseMessageTemplate responseMessageTemplete;


    /**
     * 默认构造函数
     */
    public RequestMessageTemplate() {
        this.requestMessage = new RequestMessage();
    }

    /**
     * 传入请求消息构造模板类，将同时构造响应体
     *
     * @param requestMessage 请求体
     */
    public RequestMessageTemplate(RequestMessage requestMessage) {
        this.requestMessage = requestMessage;
        responseMessageTemplete = new ResponseMessageTemplate();
    }


    public ResponseMessageTemplate getResponseMessageTemplete() {
        return this.responseMessageTemplete;
    }

    public RequestMessage getRequestMessage() {
        return this.requestMessage;
    }

    /**
     * 设置查询条件
     *
     * @param pageNo    页码，如果分页传入具体页码，不分页传入-1
     * @param pageSize  每页多少条
     * @param condition 查询条件，以Map形式传入
     */
    public void setQuery(int pageNo, int pageSize, List<Condition> condition) {
        Query query = this.requestMessage.getMessage().getBody().getQuery();
        if (query == null) {
            query = new Query();
            query.setPageno(pageNo);
            query.setPagesize(pageSize);
            query.setCondition(condition);

            this.requestMessage.getMessage().getBody().setQuery(query);
        }
    }

    /**
     * 获得消息体中的Query信息
     *
     * @return Query信息
     */
    public Query getQuery() {
        return this.requestMessage.getMessage().getBody().getQuery();
    }

    /**
     * 向响应体的DataSet中增加data子集
     *
     * @param name data子集的名称
     * @param row  data子集的数据行
     */
    public void addResponseData(String name, List row) {
        this.responseMessageTemplete.addData(name, row);
    }

    /**
     * 设置响应的业务状态和业务信息
     *
     * @param bussCode 业务响应代码
     * @param bussText 业务响应信息
     */
    public void addBussResponse(String bussCode, String bussText) {
        this.responseMessageTemplete.setBussResponse(bussCode, bussText);
    }


    /**
     * 获取响应体
     *
     * @return
     */
    public ResponseMessage getResponseMessage() {
        return this.responseMessageTemplete.getResponseMessage();
    }


    /**
     * 向请求体中增加请求的数据集合
     * @param name
     * @param row
     */
    public void addDataSet(String name, List<Object> row) {
        Data d = new Data();
        d.setName(name);
        d.setRow(row);

        this.requestMessage.getMessage().getBody().getDataset().add(d);
    }

    /**
     * 设置请求的数据集合
     *
     * @param datas 数据集
     */
    public void setDataSet(List<Data> datas) {
        this.requestMessage.getMessage().getBody().setDataset(datas);
    }

    /**
     * 获得消息体中的数据集合
     *
     * @return List<Data> 数据集合
     */
    public List<Data> getDataSet() {
        return this.requestMessage.getMessage().getBody().getDataset();
    }

    /**
     * 根据报文中DataSet的名字得到row
     *
     * @param key dataset中的name节点
     * @return 返回row节点的内容
     */
    public List<Object> getDataSetByKey(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        List<Data> datas = this.requestMessage.getMessage().getBody().getDataset();
        for (Data data : datas) {
            if (StringUtils.isBlank(data.getName())) continue;

            if (key.equalsIgnoreCase(data.getName().trim())) {
                return data.getRow();
            }
        }
        return null;
    }


    /**
     * 根据报文中DataSet的名字得到row
     * @param <T>
     * @param key 记录集合的名称
     * @param clazz 需要将数据集合转换成的集合对象
     * @return
     */
    public <T> List<T> getDataSetByKey(String key, Class clazz) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        List<Data> datas = this.requestMessage.getMessage().getBody().getDataset();
        for (Data data : datas) {
            if (StringUtils.isBlank(data.getName())) continue;

            if (key.equalsIgnoreCase(data.getName().trim())) {
                return ObjectUtil.convertListMap2ListBean(data.getRow(), clazz);
            }
        }
        return null;
    }

    /**
     * 根据报文中Condition的名字得到Condition
     *
     * @param key Condition中的name节点
     * @return 返回Condition
     */
    public Condition getConditionByKey(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        List<Condition> conditions = this.requestMessage.getMessage().getBody().getQuery().getCondition();
        for (Condition condition : conditions) {
            if (StringUtils.isBlank(condition.getName())) continue;

            if (key.equalsIgnoreCase(condition.getName().trim())) {
                return condition;
            }
        }
        return null;
    }

    /**
     * @return 返回List<Condition>
     */
    public List<Condition> getConditions() {
        return this.requestMessage.getMessage().getBody().getQuery().getCondition();
    }

    /**
     * 向requestMessage里添加condition
     *
     * @param name  Condition name
     * @param value Condition value
     * @param logic Condition logic
     */
    public void addCondition(String name, String value, String logic) {
        List<Condition> conditions = this.requestMessage.getMessage().getBody().getQuery().getCondition();
        Condition condition = new Condition();
        condition.setName(name);
        condition.setValue(value);
        condition.setLogic(logic);
        conditions.add(condition);
    }

    /**
     * 向requestMessage里添加condition
     *
     * @param condition  condition
     */
    public void addCondition(Condition condition) {
        List<Condition> conditions = this.requestMessage.getMessage().getBody().getQuery().getCondition();
        conditions.add(condition);
    }

    /**
     * 根据key移除condition
     *
     * @param key Condition中的name节点
     */
    public void removeCondition(String key) {
        List<Condition> conditions = this.requestMessage.getMessage().getBody().getQuery().getCondition();
        for (Condition condition : conditions) {
            if (key.equalsIgnoreCase(condition.getName().trim())) {
                conditions.remove(condition);
            }
        }
    }

    /**
     * 移除conditions里的condition
     *
     * @param condition condition
     */
    public void removeCondition(Condition condition) {
        List<Condition> conditions = this.requestMessage.getMessage().getBody().getQuery().getCondition();
        conditions.remove(condition);
    }

    /**
     * 返回请求体中数据集的第一个
     *
     * @return List<Map>
     */
    public List<Map> getDataSetFirst() {
        List<Data> datas = this.requestMessage.getMessage().getBody().getDataset();
        if (datas.size() > 1) {
            return (List<Map>) datas.get(0);
        }
        return null;
    }

    /**
     * 返回请求体中数据集的第一个
     *
     * @return List<Map>
     */
    public List<Object> getDataSetFirst(Class clazz) {
        List<Data> datas = this.requestMessage.getMessage().getBody().getDataset();
        if (datas.size() > 1) {
            return ObjectUtil.convertListMap2ListBean(datas.get(0).getRow(), clazz);
        }
        return null;
    }

    /**
     * 返回请求体中数据集n个
     *
     * @param index 第n个，注意从<red>0</red>开始
     * @return List<Map>
     */
    public List<Map> getDataSetByIndex(int index) {
        List<Data> datas = this.requestMessage.getMessage().getBody().getDataset();
        if (datas.size() > index + 1) {
            return (List<Map>) datas.get(index);
        }
        return null;
    }


    /**
     * 设置查询响应
     *
     * @param recordcount 总记录数
     */
    public void setQueryResponse(int recordcount) {
        int pageno = this.requestMessage.getMessage().getBody().getQuery().getPageno();
        int pagesize = this.requestMessage.getMessage().getBody().getQuery().getPagesize();
        int pagecount = (recordcount + pagesize - 1) / pagesize;
        responseMessageTemplete.setQueryResponse(pageno, pagesize, recordcount, pagecount);

    }
}
